const http = require('http');
const https = require ('https');  // https服务器
const httpProxy = require ('../node_modules/http-proxy');  // 反向代理（将某个路径反向代理到其他端口，配合https不能+端口的毛病）
const fs = require('fs');

// 新建一个代理 Proxy Server 对象
let proxy = httpProxy.createProxyServer({
	target: {
		host: '127.0.0.1',
		port: 8303
	},
	ws:true
});

// 捕获异常
proxy.on('error', function (err, req, res) {
  res.writeHead(500, {
    'Content-Type': 'text/plain'
  });
  res.end('反向代理后端服务器出错');
});

//读取当前文件的绝对路径（本文件和项目文件放到同一目录）
const documentRoot = __dirname;

//自己配置项目文件的存放路径
//const documentRoot = "C:\";

//证书配置
const options = {
	// key: fs.readFileSync('./2762879_eye.3jeye.com.key').toString(),
	// cert: fs.readFileSync('./2762879_eye.3jeye.com.pem').toString()
	key: fs.readFileSync('./2927849_datong.3jeye.com.key').toString(),
	cert: fs.readFileSync('./2927849_datong.3jeye.com.pem').toString()
}

let app = (req,res)=>{
    //客户端输入的url，例如如果输入localhost:8888/index.html
    //那么这里的url== /index.html 
	//这里配置了默认文件路径为/index.html
	//以下配置的"?from="用于微信转发时携带的参数
	//let url = req.url=="/"||req.url.includes('?from=')?"/index.html":req.url;
	
	let url , querySring;
	if(req.url=="/" || req.url=='/luru/'  || req.url=='/baogao/'){
		url = req.url + "index.html"
	}else if(req.url.includes('/luru/?')){	//微信分享
		url = "/luru/index.html"
	}else if(req.url.includes('/baogao/?')){	//微信分享
		url = "/baogao/index.html"
	}else{
		//读取query或者get请求参数
		querySring = req.url.indexOf("?")!=-1 ? req.url.slice(req.url.indexOf("?")) : '';
		url = req.url.indexOf("?")!=-1 ? req.url.slice(0,req.url.indexOf("?")) : req.url;
	}
	
	/* 非https重定向 */
	if(!req.client.ssl){
		res.writeHead(301,{
            'Location': 'https://'+req.headers.host+url
        })
		res.end();
	}
	
	/* 接口请求 反向代理到8303端口 */
	if(url.includes("/myopia/")){
		proxy.web(req, res);
	}else{
		//将URLcode转为中文，解决中文图片404问题
		let file = documentRoot + decodeURIComponent(url);
		
		/*
			读取文件
			一参为文件路径
			二参为回调函数
				回调函数的一参为读取错误返回的信息，返回空就没有错误
				二参为读取成功返回的文本内容
		*/
	   
		fs.readFile( file , (err,data)=>{
			if(err){
				res.writeHeader(404,{
					'content-type' : 'text/html;charset="utf-8"'
				});
				res.write('<h1>404错误</h1><p>你要找的页面不存在</p>');
				res.end();
			}else{
				//这里判定请求的是网页还是其他文件
				//如果文件过多，可以用fs模块识别文件的类型，以便设置不同的content-type
				if(url.lastIndexOf(".css")!=-1){
					res.writeHeader(200,{
						'content-type' : 'text/css;charset="utf-8"'
					});
				}else if(url.lastIndexOf(".pdf")!=-1){
					res.writeHeader(200,{
						'content-type' : 'application/pdf'
					});
				}else if(querySring && querySring!=''){
					//现在我们要将querySring数据写入文件
					//注意：要加载的文件中须有"{{querySring}}"字符串，方便替换。代替location.search
					data= data.toString().replace('{{querySring}}',querySring);
				}else{
					res.writeHeader(200,{
						'content-type' : 'text/html;charset="utf-8"'
					});
				}
				res.end(data);
			}
		});
		
	}
	
}

var httpServer = http.createServer(app).listen(80);
var httpsServer = https.createServer(options,app).listen(443);

//socket接收
httpsServer.on('upgrade', (req,socket,head)=>{
	proxy.ws(req, socket, head);
})

console.log('HTTP Server running on port 80');
console.log('HTTPS Server running on port 443');

//linux后台执行：`nohup node xxx.js`
//windows后台执行：使用pm2插件
//由于使用pm2,可配置日志时间戳,所以这里所有console.log或错误日志均无需添加时间